﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Revis.VClinicNet.Core.Domain.Factory
{
    public class VisitFactory
    {
        private IDateTimeService _date = null;

        public VisitFactory()
            : this(new ActualDateTimeService())
        {
        }

        public VisitFactory(IDateTimeService date)
        {
            _date = date;
        }

        public virtual Visit Book(Doctor doctor, Patient patient, DateTime date)
        {
            if (patient == null || doctor == null || date == null) {
                throw new ArgumentNullException("Null patient, doctor or date");
            }
            if (date <= _date.Now()) {
                throw new ArgumentException("Nie można zapisać się do lekarza w przeszłym terminie");
            }
            //zaookrąglamy datę do wielokrotnosci czasu wizyty
            double visitTime = (double)Visit.MinimumVisitTime.Minutes;
            int roznica = date.Minute - (int)(Math.Ceiling((date.Minute / visitTime) - 0.5) * visitTime); ;
            date = date.Date + new TimeSpan(date.Hour, date.Minute - roznica, 0);

            //sprawdzamy czy w danym terminie lekarz pracuje            
            WorkTime workTime = doctor.GetWorkTime(date.DayOfWeek);
            if (workTime.IsDateBetweenWorkTime(date) == false) {
                throw new ArgumentException("W podanym termienie wybrany lekarz nie ma dyżuru");
            }

            //tworzymy obiekt który pretenduje do dalszej dystrybucji
            Visit visit = new Visit(doctor, patient, date);

            //sprawdzamy czy podany termin nie jest juz zajety
            IList<Visit> doctorVisits = doctor.Visits;
            if (doctorVisits.Any(v => v.Date == date) == true) {
                throw new ArgumentException("Podany termin jest już zajęty");
            }

            doctor.AddVisit(visit);
            patient.AddVisit(visit);

            return visit;
        }

    }
}
